package rhplus.sistema;

import java.io.Serializable;
import java.util.List;
import javax.jdo.PersistenceManager;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import rhplus.acessoBD.PMF;

@PersistenceCapable
public class CodigoPostal implements Serializable{

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id_codigo_postal;
    @Persistent
    private int prefixo;
    @Persistent
    private int sufixo;
    @Persistent
    private String localidade;

    /** Creates a new instance of CodigoPostal */
    public CodigoPostal(final int prefixo, final int sufixo, final String localidade) {
        this.prefixo = prefixo;
        this.sufixo = sufixo;
        this.localidade = localidade;
    }

    public Long getIdCodigoPostal() {
        return id_codigo_postal;
    }

    public int getPrefixo() {
        return prefixo;
    }

    public void setPrefixo(final int prefixo) {
        this.prefixo = prefixo;
    }

    public int getSufixo() {
        return sufixo;
    }

    public void setSufixo(final int sufixo) {
        this.sufixo = sufixo;
    }

    public String getLocalidade() {
        return localidade;
    }

    public void setLocalidade(final String localidade) {
        this.localidade = localidade;
    }

    public String getRepresentacaoCurta() {
        return prefixo + " - " + sufixo;
    }

    public void setAll(CodigoPostal c) {
        this.localidade = c.getLocalidade();
        this.prefixo = c.getPrefixo();
        this.sufixo = c.getSufixo();
    }

    public static CodigoPostal devolve(final Long id_codigo_postal) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + CodigoPostal.class.getName()
                + " where id_codigo_postal == " + id_codigo_postal;

        return ((List<CodigoPostal>) pm.newQuery(query).execute()).get(0);

    }
    
    public static CodigoPostal devolve(final int prefixo, final int sufixo) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + CodigoPostal.class.getName()
                + " where prefixo == " + prefixo + " && sufixo == " + sufixo;

        List<CodigoPostal> codigo_postal = (List<CodigoPostal>) pm.newQuery(query).execute();

        return codigo_postal.get(0);
    }

    public static void insere(CodigoPostal codigo_postal) {
        
        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(codigo_postal);
        } finally {
            pm.close();
        }
    }

    public static void remove(final Long id_codigo_postal) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.currentTransaction().begin();

            // We don't have a reference to the selected Product.
            // So we have to look it up first,
            CodigoPostal codigo = pm.getObjectById(CodigoPostal.class, id_codigo_postal);
            pm.deletePersistent(codigo);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }

    }

//        public static void remove(final CodigoPostal cp){
//
//        PersistenceManager pm = PMF.get().getPersistenceManager();
//
//        try {
//            pm.currentTransaction().begin();
//
//            // We don't have a reference to the selected Product.
//            // So we have to look it up first,
//            CodigoPostal codigo = pm.getObjectById(CodigoPostal.class, id_codigo_postal);
//            pm.deletePersistent(cp);
//
//            pm.currentTransaction().commit();
//        } catch (Exception ex) {
//            pm.currentTransaction().rollback();
//            throw new RuntimeException(ex);
//        } finally {
//            pm.close();
//        }
//
//    }
    public static void altera(CodigoPostal codigo_postal) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        int prefixo = codigo_postal.getPrefixo();
        int sufixo = codigo_postal.getSufixo();
        String localidade = codigo_postal.getLocalidade();


        try {
            pm.currentTransaction().begin();

            codigo_postal = pm.getObjectById(CodigoPostal.class, codigo_postal.getIdCodigoPostal());

            codigo_postal.setPrefixo(prefixo);
            codigo_postal.setSufixo(sufixo);
            codigo_postal.setLocalidade(localidade);
            pm.makePersistent(codigo_postal);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static boolean existe(final int prefixo, final int sufixo) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        String query = "select from " + CodigoPostal.class.getName()
                + " where prefixo == " + prefixo + " && sufixo == " + sufixo;

        //CodigoPostal c = (CodigoPostal) pm.newQuery(query).execute();

        return !((List) pm.newQuery(query).execute()).isEmpty();

    }


    @Override
    public String toString() {
        return "CodigoPostal[" + id_codigo_postal + "] : " + prefixo + "-" + sufixo + " " + localidade;
    }
}
